package com.fire.rabbitmq.queue;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


/**
 * @author ：Mr.Fire
 * @date ：Created in 2021/5/10 20:19
 * @description：TTL队列
 * @modified By：
 * @version: $
 */
@Configuration
public class TtlQueue {

    /**
     * 定义延迟队列名称
     */
    public static final String DELAY_QUEUE="delayQueue";

    /**
     * 定义延迟交换机名称
     */
    public static final String DELAY_EXCHANEG="delayExchaneg";

    /**
     * 定义路由key
     */
    public static final String DELAY_ROUTKEY="nr.ttl";

    /**
     * 普通交换机作为延迟交换机
     * @return
     */
    @Bean
    DirectExchange delayExchange(){
        return new DirectExchange(DELAY_EXCHANEG);
    }

    @Bean
    Queue delayQueue(){
        Map<String, Object> map = new HashMap<>(3);
        // 队列中的消息未被消费则10秒后过期
        map.put("x-message-ttl", 10000);
        // 绑定死信交换器
        map.put("x-dead-letter-exchange", DELAY_EXCHANEG);
        // 绑定死信路由键
        map.put("x-dead-letter-routing-key", DELAY_ROUTKEY);
        /**
         * 第一个参数:队列名称
         * 第二个参数:是否持久化
         * 第三个参数: null
         * 第四个参数:是否自动删除队列(true:队列中没消息会自动删除队列)
         * 第五个参数:声明队列参数
         */
        return new Queue(DELAY_QUEUE,true,false,false,map);
    }


    @Bean
    Binding bindingTtlExchangeMessage(Queue delayQueue,DirectExchange delayExchange){
        return BindingBuilder.bind(delayQueue).to(delayExchange).with(DELAY_ROUTKEY);
    }


    //==========================================死信队列配置===========================================
    /**
     * 定义死信交换机名称
     */
    public static final String DLX_EXCHANGE_NAME = "lmf_delay_exchange";
    /**
     * 定义死信队列名称
     */
    public static final String DLX_QUEUE_NAME = "lmf_delay_queue";
    /**
     * 定义死信RoutingKey名称
     */
    public static final String DLX_ROUTING_KEY = "lmf.routing.key";
    /**
     * 定义一个死信交换器
     * 和普通的交换器 没有差别
     */
    @Bean
    public DirectExchange dlxDirectExchange() {
        return new DirectExchange(DLX_EXCHANGE_NAME);
    }
    /**
     * 定义一个监听死信交换器的死信队列
     *
     * @return
     */
    @Bean
    public Queue dlxQueue() {
        return new Queue(DLX_QUEUE_NAME);
    }
    /**
     * 将死信队列绑定到死信路由器
     */
    @Bean
    public Binding bingDlxQueue(Queue dlxQueue, DirectExchange dlxDirectExchange) {
        return BindingBuilder.bind(dlxQueue).to(dlxDirectExchange).with(DLX_ROUTING_KEY);
    }

}
